package com.sybil.ot.dominio;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.web.multipart.MultipartFile;

@Entity
@Table(name = "SIL_FACTURAS_OT")
public class Factura implements Serializable {

   private static final long serialVersionUID = 1L;
   protected FacturaPK llave;
   private String razonSocial;
   private String concepto;
   private Date fechaFactura;
   private Date fechaPago;
   private Date fechaCancela;
   private String formaPago;
   private double tipoCambio;
   private double subtotal;
   private double montoIva;
   private float porcentajeIva;
   private String rutaAnexo;
   private String usuarioCreo;
   private String usuarioModif;
   private Proveedor proveedor;
   private Moneda moneda;
   private Pedido pedido;
   private MultipartFile anexo;

   public Factura() {
   }

   public Factura(FacturaPK llave) {
      this.llave = llave;
   }

   public Factura(FacturaPK clave, String razonSocial, String concepto,
           Date fechaFactura, Date fechaPago, String formaPago, double tipoCambio,
           double subtotal, double montoIva, float porcentajeIva) {
      this.llave = clave;
      this.razonSocial = razonSocial;
      this.concepto = concepto;
      this.fechaFactura = fechaFactura;
      this.fechaPago = fechaPago;
      this.formaPago = formaPago;
      this.tipoCambio = tipoCambio;
      this.subtotal = subtotal;
      this.montoIva = montoIva;
      this.porcentajeIva = porcentajeIva;
   }

   @Transient
   public MultipartFile getAnexo() {
      return anexo;
   }

   public void setAnexo(MultipartFile anexo) {
      this.anexo = anexo;
   }

   @EmbeddedId
   @Valid
   public FacturaPK getLlave() {
      return llave;
   }

   public void setLlave(FacturaPK llave) {
      this.llave = llave;
   }

   @Column(name = "FAOT_FECHA_CANCELA")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFechaCancela() {
      return fechaCancela;
   }

   public void setFechaCancela(Date fechaCancela) {
      this.fechaCancela = fechaCancela;
   }

   @Basic(optional = false)
   @Column(name = "FAOT_RAZON_SOCIAL")
   public String getRazonSocial() {
      return razonSocial;
   }

   public void setRazonSocial(String razonSocial) {
      this.razonSocial = razonSocial;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 250, message = "Debe especificar el concepto de la factura (1-250 caracteres)")
   @Column(name = "FAOT_CONCEPTO")
   public String getConcepto() {
      return concepto;
   }

   public void setConcepto(String concepto) {
      this.concepto = concepto;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "FAOT_FECHA_FACTURA")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFechaFactura() {
      return fechaFactura;
   }

   public void setFechaFactura(Date fechaFactura) {
      this.fechaFactura = fechaFactura;
   }

   @Column(name = "FAOT_FECHA_PAGO")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFechaPago() {
      return fechaPago;
   }

   public void setFechaPago(Date fechaPago) {
      this.fechaPago = fechaPago;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "FAOT_FORMA_PAGO")
   public String getFormaPago() {
      return formaPago;
   }

   public void setFormaPago(String formaPago) {
      this.formaPago = formaPago;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "FAOT_TIPO_CAMBIO")
   public double getTipoCambio() {
      return tipoCambio;
   }

   public void setTipoCambio(double tipoCambio) {
      this.tipoCambio = tipoCambio;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "FAOT_SUBTOTAL")
   public double getSubtotal() {
      return subtotal;
   }

   public void setSubtotal(double subtotal) {
      this.subtotal = subtotal;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "FAOT_MONTO_IVA")
   public double getMontoIva() {
      return montoIva;
   }

   public void setMontoIva(double montoIva) {
      this.montoIva = montoIva;
   }

   @Basic(optional = false)
   @Column(name = "FAOT_PORCENTAJE_IVA")
   public float getPorcentajeIva() {
      return porcentajeIva;
   }

   public void setPorcentajeIva(float porcentajeIva) {
      this.porcentajeIva = porcentajeIva;
   }

   @Column(name = "FAOT_RUTA_ANEXO")
   public String getRutaAnexo() {
      return rutaAnexo;
   }

   public void setRutaAnexo(String rutaAnexo) {
      this.rutaAnexo = rutaAnexo;
   }

   @Basic(optional = false)
   @Column(name = "FAOT_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "FAOT_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @JoinColumn(name = "FAOT_PROV_NUMERO", referencedColumnName = "PROV_NUMERO")
   @ManyToOne
   public Proveedor getProveedor() {
      return proveedor;
   }

   public void setProveedor(Proveedor proveedor) {
      this.proveedor = proveedor;
   }

   @JoinColumn(name = "FAOT_MONE_CLAVE", referencedColumnName = "MONE_CLAVE")
   @ManyToOne(optional = false)
   public Moneda getMoneda() {
      return moneda;
   }

   public void setMoneda(Moneda moneda) {
      this.moneda = moneda;
   }

   @JoinColumns({
      @JoinColumn(name = "FAOT_PEOT_SERIE", referencedColumnName = "PEOT_SERIE"),
      @JoinColumn(name = "FAOT_PEOT_NUMERO", referencedColumnName = "PEOT_NUMERO")})
   @ManyToOne(optional = false)
   public Pedido getPedido() {
      return pedido;
   }

   public void setPedido(Pedido pedido) {
      this.pedido = pedido;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Factura)) {
         return false;
      }
      Factura other = (Factura) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Factura[ llave=" + llave + " ]";
   }
}
